/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2/5/2011
 * Time: 10:24 PM
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Net;
using System.Collections.Specialized;
using System.Windows.Forms;
using System.Web;
using System.Text;
using System.IO;

namespace TomatoSynchronizer
{
	/// <summary>
	/// Description of Utility.
	/// </summary>
	public static class Utility
	{
		public static void DownloadImage(string imageUrl)
		{
			Bitmap bitmap = null;
			string name = imageUrl.Substring(imageUrl.LastIndexOf("/") + 1);
			FileInfo fi = new FileInfo(name);
			
			//
			// TODO: review how to download image that already exists
			//
			if(!fi.Exists)
			{
				try
				{
					WebClient client = new WebClient();
					Stream stream = client.OpenRead(imageUrl);
					bitmap = new Bitmap(stream);
					
					if (bitmap != null)
					{
						bitmap.Save(name, ImageFormat.Jpeg);
					}

					stream.Flush();
					stream.Close();
				}
				catch (Exception e)
				{
					MessageBox.Show(e.ToString());
				}
			}
		}
		
		public static string UploadFileEx(	string uploadfile, string url,
			string fileFormName, string contenttype,NameValueCollection querystring,
			CookieContainer cookies)
		{
			if( (fileFormName== null) ||
				(fileFormName.Length ==0))
			{
				fileFormName = "file";
			}

			if( (contenttype== null) ||
				(contenttype.Length ==0))
			{
				contenttype = "application/octet-stream";
			}


			string postdata;
			postdata = "?";
			if (querystring!=null)
			{
				foreach(string key in querystring.Keys)
				{
					postdata+= key +"=" + querystring.Get(key)+"&";
				}
			}
			Uri uri = new Uri(url+postdata);


			string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
			HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
			webrequest.CookieContainer = cookies;
			webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
			webrequest.Method = "POST";


			// Build up the post message header
			StringBuilder sb = new StringBuilder();
			sb.Append("--");
			sb.Append(boundary);
			sb.Append("\r\n");
			sb.Append("Content-Disposition: form-data; name=\"");
			sb.Append(fileFormName);
			sb.Append("\"; filename=\"");
			sb.Append(Path.GetFileName(uploadfile));
			sb.Append("\"");
			sb.Append("\r\n");
			sb.Append("Content-Type: ");
			sb.Append(contenttype);
			sb.Append("\r\n");
			sb.Append("\r\n");			

			string postHeader = sb.ToString();
			byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);

			// Build the trailing boundary string as a byte array
			// ensuring the boundary appears on a line by itself
			byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

			FileStream fileStream = new FileStream(uploadfile, FileMode.Open, FileAccess.Read);
			long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
			webrequest.ContentLength = length;

			Stream requestStream = webrequest.GetRequestStream();

			// Write out our post header
			requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

			// Write out the file contents
			byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
			int bytesRead = 0;
			while ( (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 )
				requestStream.Write(buffer, 0, bytesRead);
 
			// Write out the trailing boundary
			requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
			WebResponse responce = webrequest.GetResponse();
			Stream s = responce.GetResponseStream();
			StreamReader sr = new StreamReader(s);

			return sr.ReadToEnd();
		}
		
		public static void DownloadImage(string imageUrl,string path)
		{
			if(!string.IsNullOrEmpty(imageUrl))
			{
				Bitmap bitmap = null;
				string name = imageUrl.Substring(imageUrl.LastIndexOf("/") + 1);
				name = Environment.CurrentDirectory + "/" + path + "/" + name;
				DirectoryInfo di = new DirectoryInfo(Environment.CurrentDirectory + "/" + path);
				if(!di.Exists)
				{
					di.Create();
				}
				
				FileInfo fi = new FileInfo(name);
				
				//
				// TODO: review how to download image that already exists
				//
				if(!fi.Exists)
				{
					try
					{
						WebClient client = new WebClient();
						Stream stream = client.OpenRead(imageUrl);
						bitmap = new Bitmap(stream);
						
						if (bitmap != null)
						{
							bitmap.Save(name, ImageFormat.Jpeg);
						}

						stream.Flush();
						stream.Close();
					}
					catch (Exception e)
					{
						MessageBox.Show("Impossible de telecharger l'image " + imageUrl + "....raison : "+ e.ToString());
					}
				}
			}
		}
		
		public static void DownloadFile(string url,string path)
		{
			string name = url.Substring(url.LastIndexOf("/") + 1);
			name = Environment.CurrentDirectory + "/" + path + "/" + name;
			DirectoryInfo di = new DirectoryInfo(Environment.CurrentDirectory + "/" + path);
			if(!di.Exists)
			{
				di.Create();
			}
			
			FileInfo fi = new FileInfo(name);
			
			//
			// TODO: review how to download file that already exists
			//
			if(!fi.Exists)
			{
				try
				{
					WebClient client = new WebClient();
					client.DownloadFile(url,name);
				}
				catch (Exception e)
				{
					MessageBox.Show(e.ToString());
				}
			}
		}
	}
}
